package ThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
* 线程池
* 线程池是线程的管理机制，它主要解决两个问题
* 1.重用线程
* 2.控制线程数量
* */
public class ThreadPoolDemo {
    public static void main(String[] args) {
        //创建一个有由两条线程的线程池
        ExecutorService threadpool = Executors.newFixedThreadPool(2);
        for(int i=0;i<5;i++){
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread t = Thread.currentThread();  //获得当前正在运行的线程对象
                        System.out.println(t.getName()+"正在执行任务");
                        Thread.sleep(5000);
                        System.out.println(t.getName()+"执行任务完毕");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            //将需要执行的线程交给线程池，然后等待线程池逐个运行
            threadpool.execute(runnable);
            System.out.println("将任务指派给线程成");
        }
        /*
        * 当前程序中，
        * 线程池中一共有两条线程
        *
        * 我们通过循环创建了5条需要进行循环的线程
        * 并且每次循环都将循环时需要执行的线程添加到线程池当中
        * 线程池会以类似于排队的形式执行，添加到线程池中需要执行的线程
        * 如
        * 1添加，2添加，3添加，4添加，5添加
        * 1线程执行1添加，2线程执行2添加
        * 1添加执行结束后，1线程执行3添加
        * 2线程执行结束后，2线程执行4添加
        * 1线程执行结束后，1线程执行5添加
        *
        *
        * */
        //threadpool.shutdown();  //shutdown() 关闭线程池，但是会执行完线程池中已经添加了的线程
        threadpool.shutdownNow(); //shutdownNow() 关闭线程池，并且立即结束线程池中正在运行的线程
        System.out.println("线程池关闭了！");
    }
}
